//package com.zhz.common.tool.jwt.interceptor;
//
//import com.zhz.common.tool.jwt.exception.JwtException;
//import com.zhz.common.tool.jwt.service.JwtService;
//import io.jsonwebtoken.Claims;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.Objects;
//
///**
// * 自定义拦截器
// * 继承HandlerInterceptorAdapter
// * <p>
// * preHandle:进入到控制器方法之前执行的内容
// * boolean：
// * true：可以继续执行控制器方法
// * false：拦截
// * posthandler：执行控制器方法之后执行的内容
// * afterCompletion：响应结束之前执行的内容
// * <p>
// * 1.简化获取token数据的代码编写
// * 统一的用户权限校验（是否登录）
// * 2.判断用户是否具有当前访问接口的权限
// *
// * @author zhouhengzhe
// * @date 2023/5/28
// */
//@Slf4j
//public class JwtInterceptor implements HandlerInterceptor {
//
//    private final JwtService jwtService;
//
//    public JwtInterceptor(JwtService jwtService) {
//        this.jwtService = jwtService;
//    }
//
//    /**
//     * 简化获取token数据的代码编写（判断是否登录）
//     * 1.通过request获取请求token信息
//     * 2.从token中解析获取claims
//     * 3.将claims绑定到request域中
//     */
//
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        log.info("执行登录，拦截器前 init");
//        // 1.通过request获取请求token信息
//        String authorization = request.getHeader("Authorization");
//        // 2、判断请求头信息是否为空，或者是否已Bearer开头
//        if (StringUtils.isNotBlank(authorization) && authorization.startsWith("Bearer")) {
//            //2.1、获取token数据
//            String token = authorization.replace("Bearer ", "");
//            //解析token获取claims
//            Claims claims = jwtService.parseJwt(token);
//            if (Objects.nonNull(claims)) {
//                //通过claims获取到当前用户的可访问API权限字符串
//                String apis = (String) claims.get("apis");  //api-user-delete,api-user-update
//                //通过handler
//                HandlerMethod h = (HandlerMethod) handler;
//                //获取接口上的reqeustmapping注解
//                PostMapping annotation = h.getMethodAnnotation(PostMapping.class);
//                if (Objects.nonNull(annotation)) {
//                    //获取当前请求接口中的name属性
//                    String name = annotation.name();
//                    //判断当前用户是否具有响应的请求权限
//                    if (apis.contains(name)) {
//                        request.setAttribute("user_claims", claims);
//                        return true;
//                    } else {
//                        throw new JwtException("无权限");
//                    }
//                }
//            }
//        }
//        throw new JwtException("未经身份验证的");
//    }
//}
